#ifndef WORD_H
#define WORD_H

template <int N>
class Word {
  public:
    Word();

    Bit     & operator [] (int index);
    Word<N> & operator =  (Word<N> word);

  private:
    BitSet bits[];
};

template <int N>
Word<N> & operator + (const Word<N> & w1);

template <int N>
Word<N> operator - (const Word<N> & w1);

template <int N>
Word<N> operator + (const Word<N> & w1, const Word<N> & w2);

template <int N>
Word<N> operator - (const Word<N> & w1, const Word<N> & w2);

template <int N>
Word<N> operator * (const Word<N> & w1, const Word<N> & w2);

template <int N>
Word<N> operator / (const Word<N> & w1, const Word<N> & w2);

template <int N>
Word<N> operator % (const Word<N> & w1, const Word<N> & w2);

template <int N>
Word<N> operator << (const Word<N> & w1, int n);

template <int N>
Word<N> operator >> (const Word<N> & w1, int n);

template <int N>
Word<N> operator << (Word<N> & w1, const Word<N> & w2);

template <int N>
Word<N> operator >> (const Word<N> & w1, Word<N> & w2);

template <int N>
Word<N> operator ~ (const Word<N> & w2);

template <int N>
Word<N> operator & (const Word<N> & w1, const Word<N> & w2);

template <int N>
Word<N> operator | (const Word<N> & w1, const Word<N> & w2);

template <int N>
Word<N> operator ^ (const Word<N> & w1, const Word<N> & w2);

#endif /* WORD_H */
